﻿using MotorLibrary.Error;
using MotorLibrary.Repository;
using MotorLibrary.Repository.DTO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MotorLibrary.Service
{
    public class VariableEjecucionService: IVariableEjecucionService
    {
        private IVariableEjecucionRepository _variableEjecucionRepository;
        private IVariableService _variableService;
        private IEjecucionRepository _ejecucionRepository;

        public VariableEjecucionService(
            IVariableEjecucionRepository variableEjecucionRepository,
            IVariableService variableService,
            IEjecucionRepository ejecucionRepository)
        {
            this._variableEjecucionRepository = variableEjecucionRepository;
            this._variableService = variableService;
            this._ejecucionRepository = ejecucionRepository;
        }

        public VariableEjecucionDTO Read(long id)
        {
            return _variableEjecucionRepository.Read(id);
        }

        public IList<VariableEjecucionDTO> List()
        {
            return _variableEjecucionRepository.List();
        }

        private void ChequeaExisteVariable(long variableID)
        {
            if (_variableService.Read(variableID) == null)
                throw new NoEncontradaException(variableID, "No existe la variable especificada.");
        }

        private void ChequeaExisteEjecucion(long ejecucionID)
        {
            if (_ejecucionRepository.Read(ejecucionID) == null)
                throw new NoEncontradaException(ejecucionID, "No existe la ejecución especificada.");
        }

        public VariableEjecucionDTO Create(VariableEjecucionDTO dto)
        {
            ChequeaExisteVariable(dto.VariableID);
            ChequeaExisteEjecucion(dto.EjecucionID);

            return _variableEjecucionRepository.Create(dto);
        }

        public VariableEjecucionDTO Update(VariableEjecucionDTO dto)
        {
            ChequeaExisteVariable(dto.VariableID);
            ChequeaExisteEjecucion(dto.EjecucionID);

            return _variableEjecucionRepository.Update(dto);
        }

        public VariableEjecucionDTO Delete(long id)
        {
            return _variableEjecucionRepository.Delete(id);
        }

        public IList<VariableEjecucionDTO> FilterByEjecucion(long ejecucionID)
        {
            return _variableEjecucionRepository.Filter(ve => ve.EjecucionID == ejecucionID);
        }

        public IList<VariableEjecucionDTO> FilterByVariable(long variableID)
        {
            return _variableEjecucionRepository.Filter(ve => ve.VariableID == variableID);
        }
    }
}
